WakVellios, По всему проблема в том, что каждый юнит содержит slk таблицу присваивающему max min dmg для юнитов, а строки max min не предусмотрены в РО, с остальными полями всё работает.
Решается созданием кастомной slk таблицей новых юнитов.
Причина: причин было много, а я искал лишь одну
Самыми распространёнными оказались элементарные ошибки в коде, отсутствие параметров, параметры не того типа данных (привет динамическая типизация) или лишние параметры, из за чего происходили "рандомные рассинхроны при обрыве потока"
Огромное спасибо пользователю prog, что откликнулся и смог найти ошибки, а нашёл он их при помощи языкового сервера sumneko lua для VScode
Утечка - это когда не удаляются ненужные объекты. Здесь регион нельзя удалять, потому что без него событие не будет работать. Но если у вас много таких событий, то лучше использовать один регион для всех событий, при условии, что размеры региона не будут изменяться в процессе игры, потому что это может нарушить работу других событий, привязанных к данному региону.
А функция TriggerRegisterEnterRectSimple в теории не утечна, но на практике может утекать, например, если в потоке триггера будет вызвано её уничтожение RemoveRegion(GetTriggeringRegion()).
Создай новый триггер
событие- Боевая единица входит в нужную область (A Units enters MYREGION)
условие - Боевая единица - Мой Герой (Unittype или Unit Comparison /+ Player comparison)
действие - Победа (Игра-Victory)
Предварительно создай область MYREGION
уйма времени уходит на то чтобы понять, что как работает
Де-факто нужно понимание принципов работы только в отношении тех или иных алгоритмов, внутреннее устройство игры может иметь значение в ну очень редких случаях.
мне кажется я чтото упустил....либо так..попробовать...
либо так
если integer A то он подберет из массива области увидит кто играет и создаст в эти области работников..либо присвоить по player number...не знаю
они и так рабочие
надо тестировать
Integer A всетаки буду использовать...по солиднее выглядит он..спасибо вопрос закрыт.
koloff, единственно верный вариант - перетащить весь импорт из карт в кампанию. Да, трудозатратно. Да, итоговый вес доставляет. Увы.
Представь длину списка файлов в импорте кампании под конец работы
Поэтому придется думать, что загружать, а что нет. По своему опыту знаю, что вычищать потом неиспользованные данные из импорта - сущий ад. Особенно если к каждой модели по 3-4 текстуры.
И да, музыка в mp3 формате тоже не дает грузится. Онли вав.
Gerhop, если у игрока лишь 1 герой то можно сразу дать этот скилл
при подборе предмета разрешать его а при выпадении запрещать
тогда вроде кд будет сохранятся
если мне память не изменяет
Как вариант - попытаться в одной текстуре клиффов попробовать разместить сразу два визуальных решения.
Текстуры клиффов находятся в mpq архиве по адресу ReplaceableTextures\Cliff\
Текстура клиффов
A. рандумные поверхности клиффов
B. тайлинг прямых граней, верхушка клиффа
C. тайлинг прямых граней, низ клиффа
D. угловые тайлы, выбирается 1 рандумный
E. угловые тайлы, низ клиффа
F. применяютя у мостов и подъёмников
Каждому клиффсету принадлежит два файла:
Угловатые клифы ReplaceableTextures\Cliff\Cliff0.blp
Прямые клифы ReplaceableTextures\Cliff\Cliff1.blp
Вроде всё правильно написал, если не прав поправьте.
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent
globals
constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
timer Zero//Used for 0. sec uses
integer ZTECurrent = 0
unit array ZTEUnits[ZTEArraySize]
integer array ZTEIntegers[ZTEArraySize]
real array ZTEReals[ZTEArraySize]
trigger array ZTETriggers[ZTEArraySize]
endglobals
function ZeroTimeEvent takes nothing returns nothing
loop
set ZTECurrent = ZTECurrent - 1
call TriggerExecute( ZTETriggers[ZTECurrent] )
exitwhen ZTECurrent < 1
endloop
endfunction
#define ZTEAddUnit(u) = {
set ZTEUnits[ZTECurrent] = u
}
#define ZTEAddInteger(i) = {
set ZTEIntegers[ZTECurrent] = i
}
#define ZTEAddReal(r) = {
set ZTEReals[ZTECurrent] = r
}
#define ConfirmZTE(trig) = {
set ZTETriggers[ZTECurrent] = trig
set ZTECurrent = ZTECurrent + 1
call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
}
endlibrary
Способность "Техника" имеет прикреплённые к ней спецэффекты шипов через одноимённое заклинание (тоже "Техника").
Почему шипы видны только на "больших героях"? - потому что у них есть особые точки крепления аттачей, маунт-справа/слева (на подобии нога-левая, рука-правая).
Как убрать? - логика подсказывает что нужно зачистить соответствующие поля в эффекте "Техника", что собственно и верно... и нет...
Дело в том что скилл "Техника" относится к тем, которые имеют ошибку с изменением графических параметров в РО. (меняешь, а оно всё равно по старому отображается - например тёмная стая, стадо ящерец).
Что же делать? - берёшь стандартную технику, смотришь её стандартный эффект. Удаляешь из стандартного эффекта всю графику (теперь техника не будет давать шипы). Копируешь стандартную технику - вот твой новый скилл который уже не будет давать шипов. Готово. Работаешь с новой копией.
Параметры стака ядов с одним и тем же баффом, это нужно чтобы складывались замедлени и\или урон от разных юнитов, или бафф тупо обновлялся.
С одним из параметров яды с разными баффами скатаются независимо, каждый вешает свой бафф. (годная основа для замедляющих способностей)
А игра вылетает из за зацикливания, темболее бафф при удалении и появлении наносит 0.00 ед урона, это так для справки.
Попробовал на карте дать приказ пехотинцам и стрелкам Отряд - ... Щелчок правой кнопкой мыши ... Они пошли с соблюдением боевого порядка, сначала пехотинцы, потом стрелки.
Если да, то заводишь глобальную переменную bool IsSpell = false, перед нанесением урона в коде даёшь ей true, после - обратно false. В триггере, который срабатывает на получение урона, первым действием ставишь локалку булёвую, которая ==IsSpell. Вуаля, ты отслеживаешь весь урон с абилок, а что не урон с абилок, то есть урон с руки.
Сам так всегда делал, никогда не понимал пляски с бубнами и прочими орбами. Оно, конечно, проще идеологически, но по факту намного геморройнее: добавлять орб, проверять орб, удалять орб, подменять реальный орб триггерно...
Кстати, можно по такой же схеме через логические переменные указывать тип урона, например, чистый, физический (почему бы и не давать с абилок физический урон?) или магический, от этого вообще что угодно можно пилить, хоть кучу видов брони, хоть цветовые индикаторы разного типа урона.
Вот обновленная версия на структурах, я её вроде выкладывал...
либо используйте CreateCreepOfType для создания крипов, так будет респаунить тока тех крипов которых вы создали этой функцией...
Сергей45, дело в том, что когда ты ставишь юнита на карте, то при сохранении в скрипт карты добавляется кусок, который на старте игры именно в этих координатах создаст именно этого юнита, с указанным количеством здоровья, маны, уровнем, и предметами (если есть инвентарь).
Для тебя это просто "нажал, поставил, в игре он есть". На деле же - он создаётся отдельным куском скрипта (и это нормально).
Когда ты открываешь на юните (в редакторе) вкладку с выпадающими предметами, то там можно указать выпадающие предметы и их шанс при этом. Что происходит на самом деле? - в скрипт игры вшивается кусок, который регистрирует событие смерти этого юнита (а так же событие получения над ним контроля, если его захватят то предмет тоже выпадает). Умирая этот юнит пройдёт несколько простых проверок, и дальше под ним будут созданы предметы (из списка).
Список формируется в момент смерти юнита!
Когда юнит умирает, берётся глобальный список (общий), и в нём производится очистка. После этого в него добавляются предметы и числа (т.е. шанс). После этого особая хитрая функция выбрасывает случайное число и получает по нему один из предметов (записанных ранее в список).
Готово. Именно такова суть работы базового дропа предметов.
Дальше тебе надо используя событие смерти юнита, сделать проверку на его тип, и создать нужный предмет под ним (но это будет работать в 100% случаев). Если ты хочешь добавить к этому шанс, то можно просто дополнительно прикрутить выбрасывание случайного числа (например от 1 до 100), и если оно меньше некоего другого числа (например 40), то только тогда создаёшь предмет (это будет 40%-й шанс на дроп).
А вот если тебе надо сделать хитрее, например 100% что предмет выпадет, и из них 20% что это будет кольцо на +3, и остальные 80% что это будет кольцо на +2, тогда тебе придётся добавить ещё несколько проверок, и их число будет рости от количества этих вариантов дропа.
Если ты делаешь всё на 1.26 и у тебя есть JNGP, то ты можешь сразу использовать добавленные в GUI функции для работы со списком:
call RandomDistReset() очистка списка
call RandomDistAddItem(ID,X) добавление предмета ID с шансом X (число от 0 до 100)
set itemID = RandomDistChoose() получение случайного ID из списка, за счёт шанса
Первые два - на самом дне списка действий категории "Предмет" Третий - указывается вместо типа предмета, при его создании (тоже есть в списке)
Если у тебя нет возможность использовать JNGP (например из-за версии патча), тогда ты можешь просто на прямую обращаться к этим функциям (если, конечно, они не изменились). Но для этого тебе придётся чуть-чуть обрести понимания в том как работает Jass (и CS).
Даже если в редакторе создать молоток без бафов, и использовать его в AbilityDefinition('новый молоток', 'молоток из редактора'), то при очистке бафов, стан всё равно есть, но без эффекта.
К сожалению да, бафф это по большей части просто визуал в статусе героя. На механику мало влияет.
Не получается через UnitDefinition() сделать копию Сильваны 'Hvwd'(Хуманы, компания),
Вроде никаких проблем
Код
package Hello
import NoWurst
import UnitObjEditing
import Unit
@compiletime function createSilvanas()
new UnitDefinition('NSlv', 'Hvwd')
..setName("Двурукий Стреломёт")
init
createUnit(Player(0), 'NSlv', vec2(0, 0), angle(0))
Результат
Разница между UnitDefinition и HeroDefinition в отсутствии в первой полей из второго.
Проверь, может в файле wurst_run.args, что в папке проекта, отсутствуют строки
-runcompiletimefunctions
-injectobjects
Или забыл аннотацию compiletime перед объявлением функции, в которой генерируется юнит.
Если у тебя есть необходимость в сотни пакетов, ты что-то явно делаешь не так.
Либо это будет вызывать ошибки, по типу всяких бесконечных компиляций и т.д.
Нет. Но если такая ошибка возникнет, это баг компилятора (если не твоя ошибка), о котором надо сообщить разработчику.
Ты можешь только упереться в ОП лимит, поскольку выполнение блоков init каждого пакета выполняется в пределах одной функции вызовом TriggerEvaluate. В остальном без ограничений.
У бафа нет уровня, его невозможно отследить. Но можно добавлять юниту невидимую способность со множеством уровней (например, на основе стандартной "Ауры торнадо" или "Сферы"). Эта способность, в свою очередь, будет накладывать нужный баф. А как отловить уровень способности уже сказали:
native GetUnitAbilityLevel takes unit whichUnit, integer abilcode returns integer
+
No, level of Buff!
buff == ability
function UnitHasBuffBJ takes unit whichUnit, integer buffcode returns boolean
return (GetUnitAbilityLevel(whichUnit, buffcode) > 0)
endfunction
отлавливаем применение предмета
если цель предмета совпадает с применяемым предметом то уменьшаем количество зарядов в 2 раза и даём предмет с оставшимися зарядами
Вы так не понятно разъясняете свои мысли. Сделать можно по-разному.
ограничить складывание зарядов от двух итемов в один слот. Пример максимум зарядов до 5.
зелье 1 заряд + зелье 1 заряд = зелье 2 заряда
если у зелья больше 5 зарядов, не складывать. Будет складываться в новый слот инвентаря. Есть и этот слот забьет, то складывать в новый.
> ??Событие:??
> -Боевая единица - A unit Получает предмет
> ??Условие:??
> -(Item-type of (Item being manipulated))) == "Предмет1")
> ??Действие:??
> -Set "переменная Целочисленная 1" = 0 //кол-во итемов одного типа в инвентаре
> -Set "переменная Целочисленная 2" = 0 //кол-во общих зарядов
> -Set "переменная Целочисленная 3" = 0 //номер массива
> -For each (Integer A) from 1 to 6, fo (Actions)
> --Цикл - действия:
> ---If\Then\Else, multiple function
> ----Если - условие:
> -----(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет1")
> -----(Charges remaining in (Item carried by(Hero manipulating item) in slot (Integer A))) меньше 5)
> ----То - Действие:
> -----Set "переменная Целочисленная 1" = (Set "переменная Целочисленная 1" + 1)
> -----Set "переменная Целочисленная 2" = (Set "переменная Целочисленная 2" + Charges remaining in(Item carried by(Hero manipulating item) in slot (Integer A)))
> -----Set "переменная Целочисленная 3" = Integer A
> - If\Then\Else, multiple function
> -- Если - условие:
> --- ("переменная Целочисленная 1" больше 1)
> --То - Действие:
> --- If\Then\Else, multiple function
> ---- Если - условие:
> ----- ("переменная Целочисленная 2" больше 5)
> ----То - Действие:
> ------ Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to (5) //первому перекидываем 5 зарядов
> ------ Предмет - Set Charges remaining in (Item being manipulated) to ("переменная Целочисленная 2"- 5) //оставшиеся заряды перебрасываем второму "подобранному" итему
> ---- Иначе - Действие:
> -----Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to ("переменная Целочисленная 2") //все заряды отдаем первому
> -----Предмет - Remove (Item being manipulated) //а подобранный итем удаляем, словно его и не было
хочу сделать чтобы заряды увеличивались от другого предмета
Два предмета складываются в один. Например "шар 1" и "шар 2" = "шар 1" с 2 зарядами.
Вам достаточно добавить блок-схему условие-1 ИЛИ условие-2
можешь подобрать гриб-1, так можно подобрать гриб-2, главное чтобы один из них сработал.
> ??Событие:??
> -Боевая единица - A unit Получает предмет
> ??Условие:??
> -(Multiple Conditions Or - Any (Conditions) are true //позволяет вставить проверку нескольких условии. Или первый тип или второй тип.
> --(Item-type of (Item being manipulated))) == "Предмет1")
> --(Item-type of (Item being manipulated))) == "Предмет2")
> ??Действие:??
> -Set "переменная Целочисленная 1" = 0 //кол-во итемов одного типа в инвентаре
> -Set "переменная Целочисленная 2" = 0 //кол-во общих зарядов
> -Set "переменная Целочисленная 3" = 0 //номер массива
> -For each (Integer A) from 1 to 6, fo (Actions)
> --Цикл - действия:
> ---If\Then\Else, multiple function
> ----Если - условие:
> -----(Multiple Conditions Or - Any (Conditions) are true
> ------(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет1")
> ------(Item type of (Item carried by(Hero manipulating item) in slot (Integer A))) равно "Предмет2")
> -----(Charges remaining in (Item carried by(Hero manipulating item) in slot (Integer A))) меньше 5)
> ----То - Действие:
> -----Set "переменная Целочисленная 1" = (Set "переменная Целочисленная 1" + 1)
> -----Set "переменная Целочисленная 2" = (Set "переменная Целочисленная 2" + Charges remaining in(Item carried by(Hero manipulating item) in slot (Integer A)))
> -----Set "переменная Целочисленная 3" = Integer A
> - If\Then\Else, multiple function
> -- Если - условие:
> --- ("переменная Целочисленная 1" больше 1)
> --То - Действие:
> --- If\Then\Else, multiple function
> ---- Если - условие:
> ----- ("переменная Целочисленная 2" больше 5)
> ----То - Действие:
> ------ Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to (5) //первому перекидываем 5 зарядов
> ------ Предмет - Set Charges remaining in (Item being manipulated) to ("переменная Целочисленная 2"- 5) //оставшиеся заряды перебрасываем второму "подобранному" итему
> ---- Иначе - Действие:
> -----Предмет - Set Charges remaining in (Item carried by(Hero manipulating item) in slot ("переменная Целочисленная 3") to ("переменная Целочисленная 2") //все заряды отдаем первому
> -----Предмет - Remove (Item being manipulated) //а подобранный итем удаляем, словно его и не было
Событие - постройка завершена
Действие: Если тип юнита (построенное здание) = стена,
то установить переменую-точку = позиция (построенного здания),
удалить (построенное здание)
создать декорацию типа "Стена-декорация" в точке-переменной
удалить точку
Пишу с работы, редактора под рукой нет. Прошу за ошибки и неточности простить))
Каждый вопрос заслуживает отдельного обсуждения, а на все стало лень ответ печатать, когда начал.
Печатать реально долго, легче было реализовать примеры в карте:
Кроме последнего пункта, его нужно персонально рассматривать, так как игра не подразумевает использование для юнита двух списков. Например, можно наполнить список построек у юнита всеми зданиями, часть из которых блокировать при открытии одного списка и разблокировать при открытии второго, но это подходит, когда один рабочий. Можно сделать второй список из книги заклинаний, куда добавлены способности на основе игрушечных строений, чтобы было видно карту пути и всё такое, но там для них используется один приказ, то есть всегда одинаковое здание будет при нажатии на любую способность, а ещё нет стоимости золота и дерева, что тоже придётся как-то ваять триггерно. Можно перевоплощать юнита при смене списка в другого, но там тоже сложности, не помню точно какие, вроде бы связаны с расой, так как все строят по-разному.
С точкой сбора всё просто. Способность у игрока не заблокировать, потому нужно забрать её у всех зданий, которые есть на карте, либо будут построены.
Группа из максимум 9 юнитов работает немножко коряво, ранее мы с PT153 находили какой-то вариант, чтобы работало быстро, но лень пользоваться поиском. Вроде каждую 0.01 секунду проверялось количество выбранных юнитов, лишние удалялись из выбора.
Чтобы не было очереди, пришёл в голову лишь вариант с апгрейдом здания. Но у меня реализован просто пример для одного конкретного здания, а для нескольких абстрактных зданий нужно делать текстовым триггером, который будет для каждого здания запускать локальный таймер на нужное время и добавлять анимационный текстаг work. По отмене апгрейда, либо истечению таймера анимационный тег удаляется и создаётся воин, к которому привязывается соответствующий звук. Но есть и другие варианты, типа создавать внутри здания другое, которое реально будет производить юнитов, когда заказал апгрейд, там иная реализация. И не упомянул про затрачиваемые ресурсы. Потребуется забирать/возвращать часть ресурсов при отмене апгрейда.
На примере триггеров и фиолетовых строк в редакторе объектов смотри, как сделано улучшение Бугая в Дренорского бугая.
Конечно, мог бы сделать MUI триггер на GUI для отсутствия очереди, но это было бы громоздко и в техническом смысле уродливо. производящие здания заносились бы в массив, для которого будет массив таймеров, которые будут заноситься в виде событий на истечение таймера в другой триггер, а точнее будет несколько массивов таймеров, по максимальному числу тренируемых юнитов в любом производящем здании.
Да я имел ввиду доп кампании сделанные по мотивам WC1-2 ) жаль конечно что 1 нету "я б сыграл" как говорится) , не могли бы вы пожалуйста скинуть ссылку на ToD? p.s. "За темным порталом" для WC3 очень понравилось прям как официальная ! успехов вам )
Способ есть.
Но для этого нужен Warcraft 3 и редактор.
Итого:
открываешь редактор,
открываешь в нем карту
клацаем F9 или просто Проверку карты (там иконка самая последняя в строчке, красная галочка)
Profit...
Внимание! Не все карты так можно открыть, некоторые защищенные и открытию в редакторе не подлежат, а если их восстановить, то они не всегда работоспособны.
ты бы названий таких не делал, а то модератор впаяет условку
для открытия обычных карт понадобится стандартный World Editor, идущий в комплекте с игрой
карты кампании нужно искать в архивах *.mpq, которые находятся в директории игры, в одной папке с приложением war3.exe, и для их открытия понадобятся программы наподобие Win mpq или War3ModelEditor со встроенным Mpq Browser
Можно, War#mapResorer в помощь, вот ссылочка А что именно интересует, я кое какие скиллы выкладывал, у фрога там черт ногу сломит, какие то недогуи, всякие старые скиллы которые не удалены, ужос, карта открывается в редакторе по 5 мин.
Trickster, ну так будет 100р?
В карте испоганен заголовок и хешьтаблица и удалены данные об обьектах, поэтому она не открывается ничем кроме зезулы, но зезула не дает возможность редактировать файлы. Ну собственно я это дело снял, могу восстановить открываемость в редакторе..
» WarCraft 3 / Не показывается юнит
» WarCraft 3 / Скажите как убрать утечки?
» WarCraft 3 / Поле зрения юнита
» WarCraft 3 / Поясните за утечки
» WarCraft 3 / Создание/помощь в Триггере
» WarCraft 3 / Изгнание в астрал
» WarCraft 3 / Что делать, и как вылечить Редактор Карт?
» WarCraft 3 / Сброс кулдауна
» WarCraft 3 / Не заменяются текстуры склонов
» WarCraft 3 / Манипуляции с предметом
» WarCraft 3 / Дебаф промахов.
» WarCraft 3 / Способность Техника
» WarCraft 3 / Импортировал музыку. не работает!
» WarCraft 3 / Заставить ИИ выбрать юнита
» WarCraft 3 / Отлов урона
» WarCraft 3 / Респаун Крипов
» WarCraft 3 / Можно ли использовать курсор как точку?
» WarCraft 3 / wurst.startmap' not found как исправить?
» WarCraft 3 / Получить уровень бафа ауры на юните
» WarCraft 3 / Какая здесь утечка? (GUI)
» WarCraft 3 / Складывание предметов
» WarCraft 3 / Как сделать юнита которого нельзя выбрать?
» WarCraft 3 / Как добавить нового героя в Dota 6.83c
» WarCraft 3 / Открыть карту
» WarCraft 3 / Перенос Заданий